home *** CD-ROM | disk | FTP | other *** search
- /* Session control */
- #include <stdio.h>
- #include "global.h"
- #include "config.h"
- #include "mbuf.h"
- #include "socket.h"
- #include "ftpcli.h"
- #include "telnet.h"
- #include "icmp.h"
- #include "ax25tnc.h"
- #include "session.h"
- #include "cmdparse.h"
- #include "timer.h"
- #include "proc.h"
- #include "tty.h"
-
- char *psocket(),*tcp_port();
- char *sockstate();
- void tel_upload();
-
- struct session *Sessions;
- struct session *Current;
- struct session *Lastcurrent;
-
- char Notval[] = "Not a valid control block\n";
- char Badsess[] = "Invalid session\n";
- char *Sestypes[] = {
- "",
- "Telnet",
- "FTP",
- "AX25",
- "Finger",
- "Ping",
- };
-
- /* Convert a character string containing a decimal session index number
- * into a pointer. If the arg is NULLCHAR, use the current default session.
- * If the index is out of range or unused, return NULLSESSION.
- */
- static struct session *
- sessptr(cp)
- char *cp;
- {
- register struct session *sp;
- unsigned int i;
-
- if(cp == NULLCHAR){
- sp = Lastcurrent;
- } else {
- if((i = atoi(cp)) >= Nsessions)
- return NULLSESSION;
- sp = &Sessions[i];
- }
- if(sp == NULLSESSION || sp->type == FREE)
- return NULLSESSION;
-
- return sp;
- }
-
- /* Select and display sessions */
- dosession(argc,argv)
- int argc;
- char *argv[];
- {
- struct session *sp;
- struct sockaddr fsocket;
- int i,k;
- int r,t;
- char *cp;
-
- if(argc > 1){
- if((Lastcurrent = sessptr(argv[1])) != NULLSESSION)
- go();
- else
- printf("Session %s not active\n",argv[1]);
- return 0;
- }
- printf(" # S# Type Rcv-Q Snd-Q State Remote socket\n");
- for(sp=Sessions; sp < &Sessions[Nsessions];sp++){
- if(sp->type == FREE)
- continue;
-
- i = SOCKSIZE;
- k = getpeername(sp->s,(char *)&fsocket,&i);
- r = socklen(sp->s,0);
- t = socklen(sp->s,1);
- cp = sockstate(sp->s);
- printf("%c%-3u%-4d%-8s%6d%6d %-13s%s",
- (Lastcurrent == sp)? '*':' ',
- (unsigned)(sp - Sessions),
- sp->s,
- Sestypes[sp->type],
- r,
- t,
- (cp != NULLCHAR) ? cp : "",
- (sp->name != NULLCHAR) ? sp->name : "");
- if(k == 0)
- printf(" (%s)",psocket(&fsocket));
-
- if(sp->rfile != NULLCHAR || sp->ufile != NULLCHAR)
- printf("\t");
- if(sp->rfile != NULLCHAR)
- printf("Record: %s ",sp->rfile);
- if(sp->ufile != NULLCHAR)
- printf("Upload: %s",sp->ufile);
- printf("\n");
- }
- return 0;
- }
- /* Resume current session, and wait for it */
- int
- go()
- {
- if(Lastcurrent == NULLSESSION || Lastcurrent->type == FREE)
- return 0;
- Current = Lastcurrent;
- ttysetmode(Current->ttymode);
- psignal(Current,0);
- switch(Current->type){
- case TELNET:
- pwait(Current->cb.telnet->output);
- break;
- case FTP:
- pwait(Current->cb.ftp->output);
- break;
- case AX25TNC:
- pwait(Current->cb.ax25->output);
- break;
- case PING:
- pwait(Current->cb.ping->proc);
- break;
- }
- return 0;
- }
-
- doclose(argc,argv)
- int argc;
- char *argv[];
- {
- struct session *sp;
-
- if((sp = sessptr(argc > 1 ? argv[1] : NULLCHAR)) == NULLSESSION){
- printf(Badsess);
- return -1;
- }
- shutdown(sp->s,1);
- return 0;
- }
- doreset(argc,argv)
- int argc;
- char *argv[];
- {
- register struct session *sp;
-
- if((sp = sessptr(argc > 1 ? argv[1] : NULLCHAR)) == NULLSESSION){
- printf(Badsess);
- return -1;
- }
- /* Unwedge anyone waiting for a domain resolution, etc */
- switch(sp->type){
- case FTP:
- alert(sp->cb.ftp->output,-1);
- break;
- case TELNET:
- alert(sp->cb.telnet->output,-1);
- break;
- case FINGER:
- alert(sp->cb.finger,-1);
- break;
- case AX25TNC:
- break;
- case PING:
- alert(Current->cb.ping->proc,-1);
- break;
- }
- shutdown(sp->s,2);
- if(sp->type == FTP)
- shutdown(sp->cb.ftp->data,2);
- return 0;
- }
- int
- dokick(argc,argv)
- int argc;
- char *argv[];
- {
- struct session *sp;
-
- if((sp = sessptr(argc > 1 ? argv[1] : NULLCHAR)) == NULLSESSION){
- printf(Badsess);
- return -1;
- }
- sockkick(sp->s);
- if(sp->type == FTP)
- sockkick(sp->cb.ftp->data);
- return 0;
- }
- struct session *
- newsession(name,type)
- char *name;
- int type;
- {
- register struct session *sp;
-
- for(sp=Sessions;sp < &Sessions[Nsessions];sp++){
- if(sp->type == FREE){
- sp->type = type;
- sp->s = -1;
- if(name != NULLCHAR)
- sp->name = strdup(name);
-
- Current = sp;
- return sp;
- }
- }
- return NULLSESSION;
- }
- freesession(sp)
- struct session *sp;
- {
- if(sp == NULLSESSION)
- return;
- if(sp->s != -1)
- close_s(sp->s);
- free_q(&sp->input);
- if(sp->record != NULLFILE){
- fclose(sp->record);
- sp->record = NULLFILE;
- }
- if(sp->rfile != NULLCHAR){
- free(sp->rfile);
- sp->rfile = NULLCHAR;
- }
- if(sp->upload != NULLFILE){
- fclose(sp->upload);
- sp->upload = NULLFILE;
- }
- if(sp->ufile != NULLCHAR){
- free(sp->ufile);
- sp->ufile = NULLCHAR;
- }
- if(sp->name != NULLCHAR){
- free(sp->name);
- sp->name = NULLCHAR;
- }
- sp->type = FREE;
- if(Current == sp)
- Current = NULLSESSION;
- }
- /* Control session recording */
- dorecord(argc,argv)
- int argc;
- char *argv[];
- {
- if(Lastcurrent == NULLSESSION){
- printf("No current session\n");
- return 1;
- }
- if(argc > 1){
- if(Lastcurrent->rfile != NULLCHAR){
- fclose(Lastcurrent->record);
- free(Lastcurrent->rfile);
- Lastcurrent->record = NULLFILE;
- Lastcurrent->rfile = NULLCHAR;
- }
- /* Open new record file, unless file name is "off", which means
- * disable recording
- */
- if(strcmp(argv[1],"off") != 0
- && (Lastcurrent->record = fopen(argv[1],"a")) != NULLFILE){
- Lastcurrent->rfile = strdup(argv[1]);
- }
- }
- if(Lastcurrent->rfile != NULLCHAR)
- printf("Recording into %s\n",Lastcurrent->rfile);
- else
- printf("Recording off\n");
- return 0;
- }
- /* Control file transmission */
- doupload(argc,argv)
- int argc;
- char *argv[];
- {
- struct telnet *tn;
- struct ax25tnc *axp;
-
- if(Lastcurrent == NULLSESSION){
- printf("No current session\n");
- return 1;
- }
- if(argc < 2){
- if(Lastcurrent->ufile != NULLCHAR)
- printf("Uploading %s\n",Lastcurrent->ufile);
- else
- printf("Uploading off\n");
- return 0;
- }
- switch(Lastcurrent->type){
- case TELNET:
- tn = Lastcurrent->cb.telnet;
- break;
- case AX25TNC:
- axp = Lastcurrent->cb.ax25;
- break;
- default:
- printf("Uploading not supported\n");
- return 1;
- }
- if(strcmp(argv[1],"stop") == 0 && Lastcurrent->upload != NULLFILE){
- /* Abort upload */
- fclose(Lastcurrent->upload);
- Lastcurrent->upload = NULLFILE;
- if(Lastcurrent->ufile != NULLCHAR){
- free(Lastcurrent->ufile);
- Lastcurrent->ufile = NULLCHAR;
- }
- if(tn != NULLTN){
- killproc(tn->upload);
- tn->upload = NULLPROC;
- } else if(axp != NULLTNC){
- killproc(axp->upload);
- axp->upload = NULLPROC;
- }
- return 0;
- }
- /* Open upload file */
- if((Lastcurrent->upload = fopen(argv[1],"r")) == NULLFILE){
- printf("Can't read %s\n",argv[1]);
- return 1;
- }
- Lastcurrent->ufile = strdup(argv[1]);
- /* All set, invoke the upload process */
- switch(Lastcurrent->type){
- #ifdef AX25
- case AX25TNC:
- axp->upload = newproc("upload",1024,ax_upload,0,Lastcurrent);
- break;
- #endif
- case TELNET:
- tn->upload = newproc("upload",1024,tel_upload,0,Lastcurrent);
- break;
- }
- return 0;
- }
-